[2026-02-27] P4
๐ฆฅ ๋ณธ๋ฌธ
Background
OpenFlow : Control plane๊ณผ Data plane ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ์ธํฐํ์ด์ค. ๊ธฐ์กด์๋ 12๊ฐ์ ํค๋ ํ๋์์ ๋งค์นญํ ์ ์๋ ๋จ์ผ ๊ท์น ํ ์ด๋ธ์ด ์กด์ฌ. ํ์ง๋ง ํจํท ์ฒ๋ฆฌ ๊ธฐ์ ์ ๋ฐ๋ฌ๋ก 41๊ฐ์ ๋ค๋จ๊ณ ๊ท์น ํ ์ด๋ธ์ด ์ถ๊ฐ๋๋ฉด์ ๋ณต์กํด์ง๊ณ ์์.
Motivation
- ๊ณ ์ ๋ ํ๋์จ์ด ์ค๊ณ์ ์ ์ฝ์ผ๋ก ์ธํ ๋ณต์ก์ฑ ๋ฐ ์ ์ฐ์ฑ ๋ถ์กฑ
-
ํค๋ ํ๋์ ์ถ๊ฐ์ ๋ค๋จ๊ณ ๊ท์น์ผ๋ก ์ฌ์์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐ.
โ ์ฌ์์ ํ์ฅํ๋ ๋์ ํจํท์ ํ์ฑํ๊ณ ํค๋ ํ๋๋ฅผ ๋งค์นญํ๋ ์ ์ฐํ ๋งค์ปค๋์ฆ ์ง์
-
OpenFlow๋ ์ฌ์ ์ ์ ํด์ง ํ๋์ ์ก์ ์ ์ฌ์ฉํ์ฌ ํจํท์ ์ฒ๋ฆฌํจ
โ ํน์ ํ๋กํ ์ฝ ํ๋๊ฐ ์ฌ์ ์ ์ ํด์ ธ ์์ง ์์๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์๋ก์ด ํค๋ ์ ํ์ ์ง์ ์ ์ธํ๊ณ ์ฒ๋ฆฌ
-
- ์ ์์ค ์ธํฐํ์ด์ค
-
์นฉ์ ์ ์กฐ์ฌ๋ง๋ค ๊ณ ์ ํ ํ๋ก๊ทธ๋๋ฐ ์ฒด๊ณ๋ฅผ ๊ฐ์ง๋ฉฐ ํ๋์จ์ด์ ์ฒ๋ฆฌ ๋ฐฉ์์ด ๋ค๋ฆ
โ ์ถ์ํ๋ฅผ ํตํด ํ๋์จ์ด์ ์ ๊ฒฝ ์ฐ์ง ์๊ณ ํ๋ก๊ทธ๋๋ฐ
-
Goal
- ์ฌ์ค์ ๊ฐ๋ฅ์ฑ : ์ปจํธ๋กค๋ฌ๋ ํจํท ํ์ฑ ๋ฐ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ ์ํ ์ ์์ด์ ์ ์ฐํ ๋งค์ปค๋์ฆ์ ์ ๊ณต
- ํ๋กํ ์ฝ ๋
๋ฆฝ์ฑ
- ์ค์์น๋ ํน์ ํจํท ํ์์ ์ฝ๋งค์ด์ง ์์
- ์ปจํธ๋กค๋ฌ๋ ํน์ ํจํท ํ์์ ๋ง๋ ํจํท ํ์์ ๋งค์น&์ก์ ํ ์ด๋ธ์ ์งํฉ์ ์ง์
- ํ๊ฒ ๋ ๋ฆฝ์ฑ : ํ๋ก๊ทธ๋๋จธ๊ฐ ์ค์์น์ ์ธ๋ถ ์ฌํญ์ ์ ํ์ ์์. ์ปดํ์ผ๋ฌ๋ P4 ์ฝ๋๋ฅผ ์ค์์น๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํ๊ฒ ์ข ์์ ์ธ ํ๋ก๊ทธ๋จ์ผ๋ก ๋ณํํ ๋ ์ค์์น์ ๊ธฐ๋ฅ์ ๊ณ ๋ ค.
FORWARDING MODEL

์๋ก์ด ํค๋๋ฅผ ์ ์ํ ์ ์๋ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฅํ ํ์ + ์ง๋ ฌ ๋๋ ๋ณ๋ ฌ์ ์กฐํฉ์ผ๋ก ๋ฐฐ์ด๋ ์ฌ๋ฌ ๋จ๊ณ์ ๋งค์น+์ก์ ๋จ๊ณ๋ก ๊ตฌ์ฑ.
- ์ก์
์ ํ๋กํ ์ฝ ๋
๋ฆฝ์ . ๋ํ primitive๋ค๋ก ๊ตฌ์ฑ๋จ.
- primitive : ๋ ์ด์ ์ชผ๊ฐค ์ ์๋ ์ต์ ๋จ์์ ๋์.
- ex) ์ฒดํฌ์ฌ ๊ณ์ฐ, ํ๋ ๊ฐ ์ฆ๊ฐ
- primitive : ๋ ์ด์ ์ชผ๊ฐค ์ ์๋ ์ต์ ๋จ์์ ๋์.
- ๋ค์ํ ํจํท ์ ๋ฌ ์ฅ์น ๋ฐ ์ฒ๋ฆฌ ๊ธฐ์ ์ ์ผ๋ฐํํ์ฌ ์ปดํ์ผ๋ฌ๊ฐ ๋ค์ํ ์ฅ์น์ ๋งคํํ ์ ์๋ ํ๊ฒ ๋ ๋ฆฝ์ ์ธ ํ๋ก๊ทธ๋จ์ ๋ง๋ฆ
- Configure๊ณผ Populate์ ์ํด ์ ์ด
- Configure : ์ด๋ค ํ๋กํ ์ฝ์ด ์ง์๋๋ ์ง์ ์ค์์น๊ฐ ํจํท์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ ๊ฒฐ์
- ํ์๋ฅผ ํ๋ก๊ทธ๋๋ฐ
- ๋งค์น+ ์ก์ ๋จ๊ณ์ ์์ ์ค์
- ๊ฐ ๋จ๊ณ์์ ์ฒ๋ฆฌ๋๋ ํ๋ ์ง์
- Populate : ํน์ ์์ ์ ํจํท์ ์ ์ฉ๋๋ ์ ์ฑ
์ ๊ฒฐ์ **
- Configuration ์ค์ ์ง์ ๋ ๋งค์น+์ก์ ํ ์ด๋ธ์ ์ํธ๋ฆฌ๋ฅผ ์ถ๊ฐ ๋ฐ ์ ๊ฑฐ
- Configuration ๋จ๊ณ. ์ฆ ํ์ดํ๋ผ์ธ์ ์ค๊ณํ๋ ๋จ๊ณ์์๋ ํจํท์ ์ฒ๋ฆฌํ ํ์๊ฐ ์์ง๋ง ์ค์ ๊ตฌํ ์์๋ ์ค์ ์ ๋ฐ๊พธ๋ ์ค์๋ ์ค๋จ ์์ด ํจํท์ ์ฒ๋ฆฌํด์ผ ์ฌ์ค์ ๋ชฉํ์๋ ์ด๊ธ๋์ง ์์
- ๊ณ ์ ๊ธฐ๋ฅ ASIC ์ค์์น์์๋ Configuration ๋จ๊ณ๊ฐ ์๋ฏธ๊ฐ ์๊ณ P4 ํ๋ก๊ทธ๋จ์ ์ง์ํ๋ ์ง๋ง ํ์ธ
- Configure : ์ด๋ค ํ๋กํ ์ฝ์ด ์ง์๋๋ ์ง์ ์ค์์น๊ฐ ํจํท์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ ๊ฒฐ์
๋์ ํ๋ฆ
- ํ์์ ์ํด ํจํท ์ฒ๋ฆฌ
- payload๋ ๋ณ๋๋ก ๋ฒํผ๋ง๋๋ฉฐ ๋งค์นญ์๋ ์ฌ์ฉํ ์ ์์
- ํค๋์์ ํ๋๋ฅผ ์ถ์ถ.
- ํ์๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ํ ๋๋ก, ํจํท์ ์๋ฆ. ์๋ผ์ง ํํ๋ฅผ ํ๋๋ผ๊ณ ํจ. ์ค์์น๋ ๋งค์น+์ก์ ์, ๋ฌด์จ ํ๋กํ ์ฝ์ธ์ง ๋ฐ์ง์ง ์๊ณ ํ๋๋ฅผ ๊ท์น๋๋ก ๋น๊ตํ๊ณ ๋ฐ๊ฟ
-
๋งค์น+์ก์ ํ ์ด๋ธ์ ingress์ egress๋ก ๋๋จ
๋ ๋จ๊ณ ๋ชจ๋ ํจํท ํค๋๋ฅผ ์์ ํ ์ ์์
- ingress match+action : ํจํท์ด ๋๊ฐ ์ถ๋ ฅ ํฌํธ์ ํจํท์ด ๋ฐฐ์น๋ ํ๋ฅผ ๊ฒฐ์
- ํจํท ์ ๋ฌ, ๋ณต์ (๋ฉํฐ์บ์คํธ, ์คํฌ ๋๋ control plane ์ ์ก ์ฉ), ํ๊ธฐ๋๊ฑฐ๋ flow control์ ํธ๋ฆฌ๊ฑฐ
- egress match+action : ํจํท ํค๋์ ์ธ์คํด์ค๋ณ ์์ ์ ์ํ
- ์๋ฅผ ๋ค์ด, ๋ฉํฐ์บ์คํธ ๊ฐ์ด ํ๋์ ํจํท์ ์ฌ๋ฌ ํฌํธ๋ก ๋๊ฐ ๋, ํฌํธ๋ง๋ค ์กฐ๊ธ์ฉ ๋ค๋ฅด๊ฒ ์์ ํด์ผ ํ ๋ถ๋ถ์ ์ฒ๋ฆฌ
- action table : ํ๋ ์ ๊ฐ ์ํ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ์นด์ดํฐ, policers ๋ฑ์ ์ก์
ํ
์ด๋ธ์ ํ๋ก์ฐ์ ์ฐ๊ฒฐ
- policer : ์๋ ์ ํ์ ์ถ์
- metadata ์ถ๊ฐ : ํจํท์ ๋จ๊ณ๋ง๋ค ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๋ฌ. ํจํท ํค๋ ํ๋์ ๋์ผํ๊ฒ ์ทจ๊ธ
- ์๋ฅผ ๋ค์ด, ingress port, ์ ์ก ๋ชฉ์ ์ง ๋ฐ ํ, ์ค์ผ์ฅด๋ง์ ์ฌ์ฉํ ์ ์๋ timestamp, ๊ฐ์ ๋คํธ์ํฌ ์๋ณ์ ๋ฑ
- Queueing : OpenFlow์ ๋์ผ.
- ์ก์
์ด ํจํท์ ํ์ ๋งคํ. ํ์ ์ค์ผ์ฅด๋ง์ configuration ๋จ๊ณ์์ ์ ํด์ง
- ์ค์ผ์ฅด๋ง์ ์์ : ์ต์ ๋์ญํญ, DRR ๋ฑ
- ์ก์
์ด ํจํท์ ํ์ ๋งคํ. ํ์ ์ค์ผ์ฅด๋ง์ configuration ๋จ๊ณ์์ ์ ํด์ง
- Congestion control : ๋งค์น+์ก์
ํ
์ด๋ธ์ ์ฌ์ฉํ์ฌ ๋ฉ์ปค๋์ฆ ๊ตฌํ ๊ฐ๋ฅ
- ์๋ฅผ ๋ค์ด, ECN ๋นํธ ์ค์
- ingress match+action : ํจํท์ด ๋๊ฐ ์ถ๋ ฅ ํฌํธ์ ํจํท์ด ๋ฐฐ์น๋ ํ๋ฅผ ๊ฒฐ์
A PROGRAMMING LANGUAGE
์ธ์ด์ ์ญํ
- ํจํท ํ์ ์ ์ธ : ํ์์๊ฒ ํค๋ ์ ํ ์ ์ธ
- ์๋ฅผ ๋ค์ด, ์ 14๋ฐ์ดํธ๋ ์ด๋๋ท, ๊ทธ ๋ค์๋ IP ํค๋๊ฐ ์ฌ ๊ฒ์ด๋ผ๊ณ ๊ตฌ์กฐ๋ฅผ ์ ์
- ํจํท ํค๋ ์ฒ๋ฆฌ : ์ ์ธ๋ ํค๋ ์ ํ๊ณผ ๊ธฐ๋ณธ ์ก์
์งํฉ์ ์ฌ์ฉํ์ฌ ํค๋ ํ๋ ์ฒ๋ฆฌ
- ์๋ฅผ ๋ค์ด, TTL ํ๋ ๊ฐ์, checksum ๊ณ์ฐ ๋ฑ
๊ธฐ์กด Click๊ณผ์ ๋น๊ต
C++๋ก ๊ตฌ์ฑ๋ ๋ชจ๋์ ํตํด ์ค์์น๋ฅผ ๊ตฌ์ถํ๋ ์ธ์ด
- parse - match - action ํ์ดํ๋ผ์ธ์ ๋ฐ์ํ์ง ์์
- controller-switch ๊ตฌ์กฐ๋ฅผ ์ํด ์ค๊ณ๋์ง ์์์, ๋์ ์ผ๋ก populated match+action ํ ์ด๋ธ์ ๊ธฐ์ ํ๋ ๊ฒ์ด ๋ถ๊ฐ
- ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํ ์์กด์ฑ ํ์
์ด ํ๋ฆ
-
TDG (ํ ์ด๋ธ ์์กด์ฑ ๊ทธ๋ํ) : ์์กด์ฑ์ ์๋ณํ ์ ์๋ ๊ทธ๋ํ

- ํ๋ ์ ๋ ฅ, ์ก์ , ๊ทธ๋ฆฌ๊ณ ํ ์ด๋ธ ๊ฐ์ ์ ์ด ํ๋ฆ์ ๊ธฐ์
- ๋ ธ๋๋ค์ ๋งค์น+์ก์ ํ ์ด๋ธ์ ์ง์ ๋งคํ๋๋ฉฐ, ์์กด์ฑ ๋ถ์์ ํตํด ๊ฐ ํ ์ด๋ธ์ด ํ์ดํ๋ผ์ธ์ ์ด๋์ ์์นํ ์ ์๋์ง ์๋ณ
- ํ๋ก๊ทธ๋๋จธ๊ฐ ๊ธฐ์กด C++ ๊ธฐ๋ฐ์ Click์ผ๋ก๋ TDG๋ฅผ ์๊ฐํ๊ธฐ๋ ์ด๋ ค์
-
P4์ ์ปดํ์ผ ํ๋ก์ธ์ค
- ์ ์ด ํ๋ฆ์ ๋ํ๋ด๋ P4๋ฅผ ํตํด ํ๋ก๊ทธ๋จ์ ์งฌ
- ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ TDG๋ก ๋ฒ์ญํ ํ TDG๋ฅผ ํน์ ์ค์์น์ ํ๊ฒ ํ ๋งคํ
P4 LANGUAGE BY EXAMPLE
Background
๋คํธ์ํฌ๋ End-host์ ์ง์ ์ฐ๊ฒฐ๋๋ Edge์ edge๋ค๊ณผ ์ฐ๊ฒฐ๋ core๊ฐ ์์. End-host๊ฐ ๋ง์์ง๋ฉด์ core์ L2 ํ ์ด๋ธ(์ค์์น๋ค์ด ๊ธฐ์ตํด์ผ ํ ์ฃผ์)๊ฐ ๋์นจ
- ๊ธฐ์กด ํด๊ฒฐ์ฑ
- MPLS : ์ฌ๋ฌ ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ ๋ ์ด๋ธ ๋ถ๋ฐฐ ํ๋กํ ์ฝ์ ๊ตฌํ์ด ์ด๋ ค์
- PortLand : MAC ์ฃผ์๋ฅผ ๋ค์ ์จ์ผํ๋ฏ๋ก ๊ธฐ์กด ๋คํธ์ํฌ ๋๋ฒ๊น ๋๊ตฌ๋ฅผ ๋ง๊ฐ๋จ๋ฆด ๊ฐ๋ฅ์ฑ. ARP ์์ฒญ์ ์๋ตํ ์๋ก์ด ์์ด์ ํธ๊ฐ ํ์
- P4์ mTag : 32๋นํธ ํ๊ทธ. src ๊ฒฝ๋ก ๋๋ destination locator์ด ๋ด๊น
- ํจํท์ด ์ฒซ ๋ฒ์งธ ToR ์ค์์น์ ๋ค์ด์ฌ ๋ 32๋นํธ ํ๊ทธ๋ฅผ ๋ถ์
- End-host์ NIC์์๋ ์ถ๊ฐ ๊ฐ๋ฅ
- ์ฝ์ด ์ค์์น๋ ํ๊ทธ์ 1 ๋ฐ์ดํธ๋ง ๊ฒ์ฌํ์ฌ ์ค์์นญ
- ํจํท์ด ์ฒซ ๋ฒ์งธ ToR ์ค์์น์ ๋ค์ด์ฌ ๋ 32๋นํธ ํ๊ทธ๋ฅผ ๋ถ์
P4 Concepts
- ํค๋ ์ ์ : ์ผ๋ จ์ ํ๋๋ค์ ์์์ ๊ตฌ์กฐ๋ฅผ ๊ธฐ์ . ํ๋์ ๋๋น ์ง์ ๊ณผ ํ๋ ๊ฐ ๋ฒ์์ ๋ํ ์ ์ฝ์ด๋ ๊ฐ๋ณ ํฌ๊ธฐ ํ๋์ ์ต๋ ๊ธธ์ด ์ค์
-
Ex) ํ์ค ์ด๋๋ท๊ณผ VLAN ํค๋
header ethernet { fields { dst_addr : 48; // width in bits src_addr : 48; ethertype : 16; } } header vlan { fields { pcp : 3; cfi : 1; vid : 12; ethertype : 16; } } -
mTag : ๊ธฐ์กด์ ์ ์ธ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์ถ๊ฐ. ํ๋ ์ด๋ฆ์ ๋ณด๋ฉด, ์ฝ์ด๊ฐ ๋ ๋จ๊ณ์ aggregation layer๋ก ๊ตฌ์ฑ๋์ด ์์์ ์ ์ ์์
- ์ค์์น๋ ์์น(1๋จ๊ณ ์ค์์น์ธ์ง 2๋จ๊ณ ์ค์์น์ธ์ง)์ ํจํท ์ด๋ ๋ฐฉํฅ(ํจํท์ด ์ํ์ธ์ง ํํ์ธ์ง)์ ๋ฐ๋ผ ๋ฐ์ดํธ๋ฅผ ๊ฒ์ฌ
header mTag { fields { up1 : 8; up2 : 8; down1 : 8; down2 : 8; ethertype : 16; } }
-
- ํ์ ์ ์ : ํจํท ๋ด์์ ํค๋์ ์ ํจํ ํค๋ ์ํ์ค๋ฅผ ์๋ณํ๋ ๋ฐฉ๋ฒ์ ์ง์
- ์ํ ๋จธ์ ๋ฐฉ์ : ํจํท์ ์์-๋๊น์ง ํ์ํ์ฌ ํค๋๋ฅผ ํ๋ ์ฉ ์ถ์ถ. ์ถ์ถ๋ ๊ฐ์ ๋งค์น+์ก์ ํ ์ด๋ธ๋ก ์ด๋
- ์ ์ด : ๋ค์ ํค๋๋ก ์ด๋. ํ์ฌ ํค๋์ ๊ฐ์ ์ํด ํธ๋ฆฌ๊ฑฐ
- EX) mTag
parser start { ethernet; [cite: 285, 287] } parser ethernet { switch(ethertype) { case 0x8100: vlan; [cite: 288, 289, 292] case 0x9100: vlan; [cite: 293] case 0x800: ipv4; [cite: 294] // Other cases } } parser vlan { switch(ethertype) { case 0xaaaa: mTag; [cite: 308, 309, 312] case 0x800: ipv4; [cite: 313] // Other cases } } parser mTag { switch(ethertype) { case 0x800: ipv4; [cite: 315, 316, 317] // Other cases } }
- ํ์ฑ์ start ์ํ์์ ์์ํ์ฌ stop์ด๋ ์๋ฌ ์ํฉ๊น์ง ์งํ. ์๋ก์ด ํค๋๋ฅผ ์ํ ์ํ์ ๋๋ฌํ๋ฉด ์ํ๋จธ์ ์ specification์ ์ฌ์ฉํ์ฌ ํค๋๋ฅผ ์ถ์ถํ๊ณ ์ ์ด. mTag๋ฅผ ์ํ ํ์๋ ๋จ์
- ํ
์ด๋ธ ๋งค์น : ํ
์ด๋ธ์ด ๋งค์นญํ ์ ์๋ ํ๋์ ํ
์ด๋ธ์ด ์คํํ ์ ์๋ ์ก์
์ ์ ์
-
์๋ฅผ ๋ค์ด, mTag์์ ์์ง ์ค์์น๋ L2 destination ์ฃผ์์ VLAN ID๋ฅผ ๋งค์นญํ๊ณ ํค๋์ ์ถ๊ฐํ mTag๋ฅผ ์ํ
table mTag_table { reads { ethernet.dst_addr : exact; vlan.vid : exact; } actions { // At runtime, entries are programmed with params // for the mTag action. See below. add_mTag; } max_size : 20000; }- reads : ๋งค์น ์ ํ (exact, ternary ๋ฑ)์ ๋ฐ๋ผ ์ ํ๋, ๋งค์นญํ ํ๋๋ฅผ ์ ์ธ
- actions : ํจํท์ ์ ์ฉ๋ ์ ์๋ ๊ฐ๋ฅํ ์ก์ ๋ค์ ๋์ด
- max_size : ํ ์ด๋ธ์ด ์ง์ํด์ผ ํ๋ ์ํธ๋ฆฌ์๋ฅผ ์ง์ .
- ์ปดํ์ผ๋ฌ๊ฐ ํ ์ด๋ธ ์ฌ์์ ๋ณด๊ณ ๋ฉ๋ชจ๋ฆฌ ์ ํ(TCAM, SRAM)๊ณผ ๋ฉ๋ชจ๋ฆฌ ์์ ๊ฒฐ์
-
ex) ์ ์ด ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ๋๋ ํ ์ด๋ธ์ ์ ์ ๋ง๋ณด๊ธฐ
table source_check { // Verify mtag only on ports to the core reads { mtag : valid; // Was mtag parsed? metadata.ingress_port : exact; } actions { // Each table entry specifies *one* action // If inappropriate mTag, send to CPU fault_to_cpu; // If mtag found, strip and record in metadata strip_mtag; // Otherwise, allow the packet to continue pass; } max_size : 64; // One rule per port } table local_switching { // Reads destination and checks if local // If miss occurs, goto mtag table. } table egress_check { // Verify egress is resolved // Do not retag packets received with tag // Reads egress and whether packet was mTagged }
-
- ์ก์
: ๋จ์ํ๊ณ ํ๋กํ ์ฝ ๋
๋ฆฝ์ ์ธ primitive๋ค๋ก ๋ณต์กํ ์ก์
์ ๊ตฌ์ฑํ์ฌ ์ก์
ํจ์ ์ธํธ๋ฅผ ์ ์ธ
- ์ก์ ํจ์๋ค์ ์ฌ์ ์ ์์ ์ํธ๋ฆฌ ์ถ๊ฐ ๊ณผ์ ์ ๋จ์ํ.
- P4๋ ์ก์
ํจ์ ๋ด์ primitive๋ค์ด ๋ณ๋ ฌ๋ก ์คํ๋๋ค๊ณ ๊ฐ์ .
- ๋ณ๋ ฌ ์คํ์ด ๋ถ๊ฐ๋ฅํ ์ค์์น๋ ์๋ฎฌ๋ ์ด์
์ ํตํด ๊ตฌํ
- ์๋ฎฌ๋ ์ด์ : ์ํํธ์จ์ด๋ ๋ ผ๋ฆฌ์ ์ธ ํธ๋ฆญ์ ์ฌ์ฉํ์ฌ ๊ทธ ๊ธฐ๋ฅ์ด ์๋ ๊ฒ์ฒ๋ผ ๋๊ฐ์ด ํ๋ด๋ด๋ ๊ฒ
- ๋ณ๋ ฌ ์คํ์ด ๋ถ๊ฐ๋ฅํ ์ค์์น๋ ์๋ฎฌ๋ ์ด์
์ ํตํด ๊ตฌํ
-
EX) add_mTag ์ก์
action add_mTag(up1, up2, down1, down2, egr_spec) { add_header(mTag); // Copy VLAN ethertype to mTag copy_field(mTag.ethertype, vlan.ethertype); // Set VLANโs ethertype to signal mTag set_field(vlan.ethertype, 0xaaaa); set_field(mTag.up1, up1); set_field(mTag.up2, up2); set_field(mTag.down1, down1); set_field(mTag.down2, down2); // Set the destination egress port as well set_field(metadata.egress_spec, egr_spec); }- ์ก์ ์ ๋งค๊ฐ๋ณ์๋ ๋ฐํ์์ ๋งค์น ํ ์ด๋ธ๋ก๋ถํฐ ์ ๊ณต
- ์์ ๊ธฐ๋ฅ์ VLAN ํ๊ทธ ๋ค์ mTag๋ฅผ ์ฝ์ ํ๊ณ ๋ค์์ ์ค๋ ๋ด์ฉ์ ๋ํ๋ด๊ธฐ ์ํด VLAN ํ๊ทธ์ Ethertype์ mTag๋ก ๋ณต์ฌํ๋ฉฐ mTag์์ ์ ํธํ๊ธฐ ์ํด VLAN ํ๊ทธ์ 0xaaaa๋ก ์ค์
- ํจํท์์ mTag๋ฅผ ์ ๊ฑฐํ๋ ์ญ๋ฐฉํฅ ์ก์ ์ฌ์๊ณผ ์์ง ์ค์์น์์ ์ด ์ก์ ์ ์ ์ฉํ๋ ํ ์ด๋ธ์ ์ ์ผ์
- primitive actions
- set field : ํค๋์ ํน์ ํ๋๋ฅผ ํน์ ๊ฐ์ผ๋ก ์ค์ . ๋ง์คํฌ ์ค์ ์ด ์ง์.
- copy field : ํ ํ๋๋ฅผ ๋ค๋ฅธ ํ๋๋ก ๋ณต์ฌ.
- add header : ํน์ ํค๋ ์ธ์คํด์ค์ ๊ทธ ๋ชจ๋ ํ๋๋ฅผ ์ ํจํ ์ํ๋ก ์ค์ .
- remove header : ํจํท์์ ํค๋์ ๊ทธ ๋ชจ๋ ํ๋๋ฅผ ์ญ์ (pop).
- increment : ํ๋์ ๊ฐ์ ์ฆ๊ฐ์ํค๊ฑฐ๋ ๊ฐ์.
- checksum : IPv4 ์ฒดํฌ์ฌ๊ณผ ๊ฐ์ด ์ผ๋ถ ํค๋ ํ๋ ์งํฉ์ ๋ํ ์ฒดํฌ์ฌ์ ๊ณ์ฐ.
- ์ ์ด ํ๋ก๊ทธ๋จ : ๋งค์น+์ก์
ํ
์ด๋ธ์ ์์๋ฅผ ๊ฒฐ์ . ๋จ์ํ ๋ช
๋ นํ ํ๋ก๊ทธ๋จ์ด ๋งค์น+์ก์
ํ
์ด๋ธ ๊ฐ์ ์ ์ด ํ๋ฆ์ ๊ธฐ์
- ํจ์, ์กฐ๊ฑด๋ฌธ, ํ ์ด๋ธ ์ฐธ์กฐ์ ์งํฉ์ ํตํด ์ ์ด ํ๋ฆ์ ์ง์
-
mTag ๊ตฌํ

- ํ์ฑ ํ source_check ํ
์ด๋ธ์์ ์์ ๋ ํจํท๊ณผ ์ธ๊ทธ๋ ์ค ํฌํธ ์ฌ์ด์ ์ผ๊ด์ฑ ๊ฒ์ฆ
- mTag๋ ์ฝ์ด ์ค์์น์ ์ฐ๊ฒฐ๋ ํฌํธ์์๋ง ๋ณด์ด๊ฒ ๋จ
- mTag๋ฅผ ์ ๊ฑฐํ๊ณ ์์๋์ง ์ฌ๋ถ๋ฅผ ๋ฉํ๋ฐ์ดํฐ์ ๊ธฐ๋ก.
- ์ด ํ ํ ์ด๋ธ์ด ํ๊ทธ๋ฅผ ๋ถ์ด๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋งค์นญ์ ์ฌ์ฉ
- local_switching ํ
์ด๋ธ
- miss๊ฐ ๋ฐ์ํ๋ฉด ํจํท์ ๋ชฉ์ ์ง๊ฐ ๋ก์ปฌ๋ก ์ฐ๊ฒฐ๋ ํธ์คํธ๊ฐ ์๋
- mTag_table์ด ์ ์ฉ
- ๋ก์ปฌ๋ก ๊ฐ๋ (hit), Core๋ก ๊ฐ๋ (miss) egress_check ํ
์ด๋ธ ์ ์ฉ
- ๋ง์ฝ ๋ชฉ์ ์ง๋ฅผ ์ ์ ์๋ ๊ฒฝ์ฐ SDN controller์๊ฒ ์๋ฆผ์ ๋ณด๋ - ์ฝ๋
- miss๊ฐ ๋ฐ์ํ๋ฉด ํจํท์ ๋ชฉ์ ์ง๊ฐ ๋ก์ปฌ๋ก ์ฐ๊ฒฐ๋ ํธ์คํธ๊ฐ ์๋
control main() { // Verify mTag state and port are consistent table(source_check); // If no error from source_check, continue if (!defined(metadata.ingress_error)) { // Attempt to switch to end hosts table(local_switching); if (!defined(metadata.egress_spec)) { // Not a known local host; try mtagging table(mTag_table); } // Check for unknown egress state or // bad retagging with mTag. table(egress_check); } } - ํ์ฑ ํ source_check ํ
์ด๋ธ์์ ์์ ๋ ํจํท๊ณผ ์ธ๊ทธ๋ ์ค ํฌํธ ์ฌ์ด์ ์ผ๊ด์ฑ ๊ฒ์ฆ
Compiling A P4 Program
Compiling Packet Parsers
- ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฅํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ, ํ๋ก๊ทธ๋๋จธ ์ฝ๋์ ํตํด ํ์ฑ ์ํ ๋จธ์ ์ผ๋ก ๋ง๋ฆ
- ๊ณ ์ ๋ ํ์์ ๊ฒฝ์ฐ, ์ฝ๋๊ฐ ์ค์ ์ฅ๋น์ ์ฌ์์ด ์ผ์นํ๋์ง๋ง ํ์ธ
-
ํ์์ VLAN ๋ฐ mTag ์น์ ์ ๋ํ ์ํ ํ ์ด๋ธ ์ํธ๋ฆฌ

- ํ์ฌ ์ํ, ๋งค์นญํ ํ๋ ๊ฐ, ๋ค์ ์ํ๋ฅผ ์ง์
Compiling Control Programs
์ ์ด ํ๋ก๊ทธ๋จ ๋ถ์์ ํตํด ์์กด์ฑ์ ์๋ณํ๋ฉฐ ํค๋ ํ๋๋ฅผ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ. ์ปดํ์ผ๋ฌ๋ ์ค์์น๋ฅผ ์ํ ํ๊ฒ configuration์ ์์ฑ
ํ๊ฒ์ ๋ฐ๋ฅธ ํ๋ก์ธ์ค
๊ธฐ๋ณธ์ ์ผ๋ก 2๋จ๊ณ ์ปดํ์ผ ํ๋ก์ธ์ค ( ์ฝ๋๋ฅผ TDG๋ก ๋ฐ๊พผ ํ ์์กด์ฑ ํ์ธ. ์ฅ๋น์ ๋ง์ถฐ ๋ฐฐ์น )๋ฅผ ๋ฐ๋ฆ
- ์ํํธ์จ์ด ์ค์์น
- ํน์ง : ํ ์ด๋ธ ์, ํ ์ด๋ธ ๊ตฌ์ฑ ๋ฐ ํ์ฑ์ด ์ํํธ์จ์ด๋ฅผ ํตํด ์ ์ดํ์ฌ ์ ์ฐํจ
- ๋ฐฉ์ : mTag TDG๋ฅผ ํ ์ด๋ธ์ ๊ทธ๋๋ก ๋งคํ. ํ ์ด๋ธ ์ ํ ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ด๋ธ์ ๋๋น, ๋์ด ๋ฐ ๋งค์นญ ๊ธฐ์ค(์: exact, prefix ๋๋ wildcard)์ ์ ํ. ์ํํธ์จ์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์ฌ ternary ๋๋ prefix ๋งค์นญ์ ์ต์ ํ
- RAM&TCAM์ ๊ฐ์ง ํ๋์จ์ด ์ค์์น
- ๋ฐฉ์
- mTag ํ ์ด๋ธ์ ๋ํด RAM์ ์ฌ์ฉํ์ฌ Hashing ๊ธฐ๋ฐ ์ ํ๋ ๋งค์นญ์ ์ํ.
- ํ๊ทธ ์ผ๋ถ๋ง ๋งค์นญํ๋ ์ฝ์ด mTag ํฌ์๋ฉ ํ ์ด๋ธ์ TCAM์ ๋งคํ
- ๋ฐฉ์
- ๋ณ๋ ฌ ํ
์ด๋ธ์ ์ง์ํ๋ ์ค์์น
- ๋ฐฉ์ : ์ปดํ์ผ๋ฌ๊ฐ ์์กด์ฑ์ ๊ฐ์งํ์ฌ ํ
์ด๋ธ์ ๋ณ๋ ฌ ๋๋ ์ง๋ ฌ๋ก ๋ฐฐ์น
- ์๋ฅผ ๋ค์ด, mTag_table๊ณผ local_switching ํ ์ด๋ธ์ ์์กด์ฑ์ด ์์ผ๋ฏ๋ก ๋ณ๋ ฌ๋ก ์คํ
- ๋ฐฉ์ : ์ปดํ์ผ๋ฌ๊ฐ ์์กด์ฑ์ ๊ฐ์งํ์ฌ ํ
์ด๋ธ์ ๋ณ๋ ฌ ๋๋ ์ง๋ ฌ๋ก ๋ฐฐ์น
- ํ์ดํ๋ผ์ธ ๋์์ ์ก์
์ ์ ์ฉํ๋ ์ค์์น
- ๋ฐฉ์ : ์ปดํ์ผ๋ฌ๊ฐ ์ค๊ฐ ๋จ๊ณ์์ ์ต์ข ์ฐ๊ธฐ์ ์ฌ์ฉ๋ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋๋ก ์ง์
- ์ ์ ์์ ํ
์ด๋ธ์ ๊ฐ์ง ์ค์์น
- ๋ฐฉ์ : ์ปดํ์ผ๋ฌ๋ ๋ค์์ P4 ํ
์ด๋ธ์ ๋ ์ ์ ์์ ๋ฌผ๋ฆฌ์ ํ
์ด๋ธ๋ก ๋งคํ. ์ปจํธ๋กค๋ฌ๊ฐ ๋ฐํ์์ ์๋ก์ด ๊ท์น์ ์ค์นํ ๋, ์ปดํ์ผ๋ฌ์ ๊ท์น ๋ณํ๊ธฐ๋ ๋ P4 ํ
์ด๋ธ์ ๊ท์น์ ํฉ์ฑํ์ฌ ๋จ์ผ ๋ฌผ๋ฆฌ์ ํ
์ด๋ธ์ ์ํ ๊ท์น์ ์์ฑ
- ์๋ฅผ ๋ค์ด, local_switching์ mTag ํ ์ด๋ธ๊ณผ ํตํฉ
- ๋ฐฉ์ : ์ปดํ์ผ๋ฌ๋ ๋ค์์ P4 ํ
์ด๋ธ์ ๋ ์ ์ ์์ ๋ฌผ๋ฆฌ์ ํ
์ด๋ธ๋ก ๋งคํ. ์ปจํธ๋กค๋ฌ๊ฐ ๋ฐํ์์ ์๋ก์ด ๊ท์น์ ์ค์นํ ๋, ์ปดํ์ผ๋ฌ์ ๊ท์น ๋ณํ๊ธฐ๋ ๋ P4 ํ
์ด๋ธ์ ๊ท์น์ ํฉ์ฑํ์ฌ ๋จ์ผ ๋ฌผ๋ฆฌ์ ํ
์ด๋ธ์ ์ํ ๊ท์น์ ์์ฑ
Conclusion
- OpenFlow์ ํ๊ณ : ๋ฏธ๋ฆฌ ์ ํด์ง ํค๋์ ์ก์ ๋ง ์ฌ์ฉํ ์ ์๋ ๊ณ ์ ๊ธฐ๋ฅ ์ค์์น๋ฅผ ๋์์ผ๋ก ํ๊ธฐ์ ์ ์ฐ์ฑ ๋ถ์กฑ
- Data plane ์ ์ด : ์ฝ๋ โ TDG โ ํ๊ฒ ์ค์์น์ ๋งคํ
- ํ์ฌ๋ ํจํท ์ฒ๋ฆฌ ๋ฐฉ์์ ์ง์คํ๊ณ ์์ผ๋ฉฐ ํผ์ก ์ ์ด, ํ์, ํธ๋ํฝ ๋ชจ๋ํฐ๋ง ๋ฑ ์ธ๋ถ์ ์ธก๋ฉด์ ๊ณผ์ ๋ก ๋จ์
Leave a comment